package controller

import (
	"fmt"
	"go_web_learn/initconf"
	"go_web_learn/model"
	"time"

	"github.com/gin-gonic/gin"
	"gorm.io/gorm"
)

// 新增数据
func Two1(c *gin.Context) {
	db := initconf.DB
	info1 := model.StuInfo{
		Model: gorm.Model{
			CreatedAt: time.Now(),
			UpdatedAt: time.Now(),
		},
		Name:      "小明",
		Class:     "1班",
		StudentId: "001",
	}
	// 创建时间和修改时间会自动帮我们生成,可以不管
	info2 := model.StuInfo{
		Model:     gorm.Model{},
		Name:      "老王",
		Class:     "2班",
		StudentId: "002",
	}
	db.Create(&info1)
	db.Create(&info2)
	// 指定字段插入
	db.Select("name", "class").Create(&info2)
	// 忽视字段插入
	db.Omit("name", "class").Create(&info2)
}

// 删除
func Two2(c *gin.Context) {
	db := initconf.DB
	info := model.StuInfo{
		Model: gorm.Model{
			ID: 1,
		},
	}
	// 因为使用了gorm.Model, 会逻辑删除即给deleted_at添加上删除时间
	db.Delete(&info)
	// 忽视逻辑删除字段就会物理删除
	db.Unscoped().Delete(&info)
}

// 修改
func Two3(c *gin.Context) {
	db := initconf.DB
	info1 := model.StuInfo{}
	db.Where("student_id", "001").Find(&info1)
	fmt.Println(info1)
	info1.Name = "tom"
	// save是全部修改且有就修改没有就新增 update是部分修改
	db.Save(&info1)
	// 指定字段更新
	db.Select("name").Save(&info1)
	// 更新指定字段 Model是告诉更新哪一张表 如果后面传的是实体对象就不需要了
	db.Model(&model.StuInfo{}).Where("student_id = ?", "002").Update("name", "德玛西亚")
}

// 查询
func Two4(c *gin.Context) {
	db := initconf.DB
	info1 := model.StuInfo{}
	info2 := model.StuInfo{}
	info3 := model.StuInfo{}
	info4 := model.StuInfo{}
	info5 := model.StuInfo{}
	info6 := model.StuInfo{}
	infos := []model.StuInfo{}
	// 获取第一条记录（主键升序）
	db.First(&info1)
	// 获取一条记录,没有指定排序字段,全表扫,然后随机一条
	db.Take(&info2)
	// 获取最后一条记录（主键降序）
	db.Last(&info3)
	// Find查询多条,然后放进infos
	db.Find(&infos)
	fmt.Println(infos)
	db.Table("stu_info").First(&info4)
	// 想要查询被软删除的数据
	db.Unscoped().First(&info5)
	// 查询条数
	var count int64
	db.Model(&info6).Where("name = ?", "qwer").Count(&count)
	// 这个也是条数
	affected := db.Model(&info6).Where("name = ?", "qwer").RowsAffected
	fmt.Println(count, "---", affected)
}

// sql增删改
func Two5(c *gin.Context) {
	db := initconf.DB
	db.Exec("delete from stu_info where student_id = ?", "002")
}

// sql查
func Two6(c *gin.Context) {
	db := initconf.DB
	info := model.StuInfo{}
	db.Raw("select * from stu_info where id = ?", 1).Scan(&info)
	fmt.Println(info)
}
